/*********************************************************************************************************************
* CYT2BL3 Opensourec Library 即（ CYT2BL3 开源库）是一个基于官方 SDK 接口的第三方开源库
* Copyright (c) 2022 SEEKFREE 逐飞科技
*
* 本文件是 CYT2BL3 开源库的一部分
*
* CYT2BL3 开源库 是免费软件
* 您可以根据自由软件基金会发布的 GPL（GNU General Public License，即 GNU通用公共许可证）的条款
* 即 GPL 的第3版（即 GPL3.0）或（您选择的）任何后来的版本，重新发布和/或修改它
*
* 本开源库的发布是希望它能发挥作用，但并未对其作任何的保证
* 甚至没有隐含的适销性或适合特定用途的保证
* 更多细节请参见 GPL
*
* 您应该在收到本开源库的同时收到一份 GPL 的副本
* 如果没有，请参阅<https://www.gnu.org/licenses/>
*
* 额外注明：
* 本开源库使用 GPL3.0 开源许可证协议 以上许可申明为译文版本
* 许可申明英文版在 libraries/doc 文件夹下的 GPL3_permission_statement.txt 文件中
* 许可证副本在 libraries 文件夹下 即该文件夹下的 LICENSE 文件
* 欢迎各位使用并传播本程序 但修改内容时必须保留逐飞科技的版权声明（即本声明）
*
* 文件名称          zf_driver_gpio
* 公司名称          成都逐飞科技有限公司
* 版本信息          查看 libraries/doc 文件夹内 version 文件 版本说明
* 开发环境          IAR 9.40.1
* 适用平台          CYT2BL3
* 店铺链接          https://seekfree.taobao.com/
*
* 修改记录
* 日期              作者                备注
* 2024-1-4       pudding            first version
********************************************************************************************************************/

#ifndef _zf_driver_gpio_h_
#define _zf_driver_gpio_h_

#include "zf_common_typedef.h"

typedef enum // 枚举端口 
{
    // 在设置IO时请自行根据硬件确认当前芯片是否具有此IO
    // 在设置IO时请自行根据硬件确认当前芯片是否具有此IO
    // 在设置IO时请自行根据硬件确认当前芯片是否具有此IO
    // 部分引脚在本枚举中仅作为占位使用，实际核心板并没有以下引脚
    // 部分引脚在本枚举中仅作为占位使用，实际核心板并没有以下引脚
    // 部分引脚在本枚举中仅作为占位使用，实际核心板并没有以下引脚

    P00_0 = 0 * 8,  P00_1,  P00_2,  P00_3,      
                
    P01_0 = 1 * 8,  P01_1,                     
                
    P02_0 = 2 * 8,  P02_1,  P02_2,  P02_3,  P02_4,    
                
    P03_0 = 3 * 8,  P03_1,  P03_2,  P03_3,  P03_4,    
                
    P04_0 = 4 * 8,  P04_1,                             
                
    P05_0 = 5 * 8,  P05_1,  P05_2,  P05_3,  P05_4,                             
                
    P06_0 = 6 * 8,  P06_1,  P06_2,  P06_3,  P06_4,  P06_5,  P06_6,  P06_7,     
                
    P07_0 = 7 * 8,  P07_1,  P07_2,  P07_3,  P07_4,  P07_5,  P07_6,  P07_7,     
                
    P08_0 = 8 * 8,  P08_1,  P08_2,  P08_3,           
                
    P09_0 = 9 * 8,  P09_1,                          
    
    P10_0 = 10 * 8, P10_1,  P10_2,  P10_3,  P10_4,
                 
    P11_0 = 11 * 8, P11_1,  P11_2,
                                                 
    P12_0 = 12 * 8, P12_1,  P12_2,  P12_3,  P12_4,  P12_5,
                 
    P13_0 = 13 * 8, P13_1,  P13_2,  P13_3,  P13_4,  P13_5,  P13_6,  P13_7,
                 
    P14_0 = 14 * 8, P14_1,  P14_2,  P14_3,  P14_4,  P14_5,
                 
    P15_0 = 15 * 8, P15_1,  P15_2,  P15_3,
                 
    P17_0 = 17 * 8, P17_1,  P17_2,  P17_3,  P17_4,
                 
    P18_0 = 18 * 8, P18_1,  P18_2,  P18_3,  P18_4,  P18_5,  P18_6,  P18_7,
                 
    P19_0 = 19 * 8, P19_1,  P19_2,  P19_3,  P19_4,
                 
    P20_0 = 20 * 8, P20_1,  P20_2,  P20_3,
                 
    P21_0 = 21 * 8, P21_1,  P21_2,  P21_3,  P21_4,  P21_5,  P21_6,
                 
    P22_0 = 22 * 8, P22_1,  P22_2,  P22_3,  P22_4,  P22_5,  P22_6,
    
    P23_0 = 23 * 8, P23_1,  P23_2,  P23_3,  P23_4,  
    
    P23_7 = 23 * 8 + 7,
    
    NC,
}gpio_pin_enum;

typedef enum               // 枚举端口方向    此枚举定义不允许用户修改
{
    GPI = 0,               // 定义管脚输入方向
    GPO = 1,               // 定义管脚输出方向
}gpio_dir_enum;

typedef enum               // 枚举端口电平    此枚举定义不允许用户修改
{
    GPIO_LOW =  0,         // 定义低电平
    GPIO_HIGH = 1,         // 定义高电平
}gpio_level_enum;

typedef enum               // 枚举端口模式   此枚举定义不允许用户修改
{
    GPI_FLOATING_IN,       // 定义管脚浮空输入
    GPI_PULL_UP    ,       // 定义管脚上拉输入
    GPI_PULL_DOWN  ,       // 定义管脚下拉输入

    GPO_PUSH_PULL  ,       // 定义管脚推挽输出
    GPO_OPEN_DTAIN ,       // 定义管脚开漏输出
}gpio_mode_enum;

//====================================================GPIO 快捷函数====================================================
#define     get_port(pin)               ((volatile stc_GPIO_PRT_t*) &GPIO->PRT[(((uint8)pin) >> 3U)])
#define     get_port_in_addr(pin)       ((uint32)(((uint8)(((uint8)pin) >> 3U)) * 0x80) + 0x40310000UL + 0x10)  // port * 单组引脚内存 + GPIO寄存器起始地址 + GPIO_IN寄存器偏移地址
#define     get_port_out_addr(pin)      ((uint32)(((uint8)(((uint8)pin) >> 3U)) * 0x80) + 0x40310000UL)		// port * 单组引脚内存 + GPIO寄存器起始地址 + GPIO_IN寄存器偏移地址
//------------------------------------------------------------------------------------------------------------------
// 函数简介     对应 IO 置位为高电平
// 参数说明     x           选择的引脚 (可选择范围由 zf_driver_gpio.h 内 gpio_pin_enum 枚举值确定)
// 返回参数     void
// 使用示例     gpio_high(P00_0);// P00_0 输出高电平
// 备注信息	该函数直接对寄存器操作 	
//------------------------------------------------------------------------------------------------------------------
#define     gpio_high(x)                ((*(volatile uint32_t*)(0x40310000UL + (0x80 * ((uint8_t)(((uint8_t)(x)) >> 3U))) + 0x08)) = (0x01 << ((uint8_t)(((uint8_t)x) & 0x07U))))      // GPIO置位 

//------------------------------------------------------------------------------------------------------------------
// 函数简介     对应 IO 置位为低电平
// 参数说明     x           选择的引脚 (可选择范围由 zf_driver_gpio.h 内 gpio_pin_enum 枚举值确定)
// 返回参数     void
// 使用示例     gpio_low(P00_0);// P00_0 输出低电平
// 备注信息     该函数直接对寄存器操作
//------------------------------------------------------------------------------------------------------------------
#define     gpio_low(x)                 ((*(volatile uint32_t*)(0x40310000UL + (0x80 * ((uint8_t)(((uint8_t)(x)) >> 3U))) + 0x04)) = (0x01 << ((uint8_t)(((uint8_t)x) & 0x07U))))      // GPIO复位 

//====================================================GPIO 快捷函数====================================================

//====================================================GPIO 基础函数====================================================
void  gpio_set_level    (gpio_pin_enum pin, uint8 dat);
uint8 gpio_get_level     (gpio_pin_enum pin);
void  gpio_toggle_level (gpio_pin_enum pin);
void  gpio_set_dir      (gpio_pin_enum pin, gpio_dir_enum dir, gpio_mode_enum pinconf);
void  gpio_init         (gpio_pin_enum pin, gpio_dir_enum dir, uint8 dat, gpio_mode_enum pinconf);
//====================================================GPIO 基础函数====================================================

#endif
